Predicció accidents vasculars cerebrals

NOM I COGNOMS: Jordi Gual Obradors | Daniel Lijia Hu

1. Descripció del dataset. Perquè és important i quina pregunta/problema pretén respondre?

Està extreta del dataset original penjat a Kaggle per Fede Soriano. https://www.kaggle.com/fedesoriano/stroke-prediction-dataset

Context:

Segons la Organització Mundial per a la Salut, els accidents vasculars cerebrals (AVC) són la segona causa de mort a nivell mundial, responsables de prop del 11% de les morts totals.

Aquest conjunt de dades s'utilitza per a predir la probabilitat d'AVC per a un pacient a partir de dades com ara gènere, edat, historial mèdic i adicció al tabac. Cada filera correspon a informació rellevant per a cada pacient. Aquesta predicció pot ajudar a identificar aquestes persones susceptibles a patir un infart i poder prevenir-lo o predir-lo abans que succeeixi l'esdeveniment

El dataset es composa de 5110 registres diferents amb 12 variables diferents. Aquests variables són:

Informació dels atributs.

Importació de llibreries utilitzades:

Càrrega de les dades

Primeres informacions del dataset

2. Integració i selecció de les dades d’interès a analitzar

Com es veu, el dataset original es composa de 5110 registres diferents amb 12 variables. Seleccionarem les dades les quals tenim un registre complet o rellevant estadísticament.

3. Neteja de les dades.

3.1. Les dades contenen zeros o elements buits? Com gestionaries aquests casos?

3.2. Identificació i tractament de valors extrems.

Ara ja només ens queden 5110 - 201 - 1 = 4908 registres on no hi ha na's al bmi ni Other al gender. Passem a analitzar el tema outliers. L'atribut amb major presència d'outliers és el bmi. Definim outliers com aquells valors que superen en 1.5 vegades el valor interquartilic, comptant a partir del Q3. En el cas de bmi aquesta condició proporciona un valor de 47.5. Anem ara a veure quants pacients amb bmi extrem tenim:

Tenim 110 pacients amb un índex elevat de massa corporal. Els podríem eliminar o no sobretot en funció de quína proporció representen respecte als que tenen o no un AVC. Ja anem prou justos de valors amb stroke = 1 com per desprendre's de cap més!

Els pacients amb un índex elevat de massa corporal representen 2/110 = 1.8% dels pacients amb AVC mentre que en general tenim un 4.9%. Per tant, comptar-los o no serà poc influent. No obstant això, optem per no excloure'ls.

Finalment, exportarem el dataset en un .csv

4. Anàlisi de les dades.

4.1. Selecció dels grups de dades que es volen analitzar/comparar (planificació dels anàlisis a aplicar).

Anem ara a presentar els diferents atributs en funció del valor de classe. Comencem pels atributs categòrics.

Fem ara el mateix amb els atributs numèrics. Al estar les dades desequilibrades, treballarem amb les densitats en lloc dels comptatges

Ja que tindrem en compte totes les variables, categòriques i quantitatives per la predicció de l'esdeveniment d'infart (stroke = 1) o no (stroke = 0), treballarem en la creació d'un classificador de pacients.

4.2. Comprovació de la normalitat i homogeneïtat de la variància.

Comprovarem la normalitat de la variància en les tres variables quantitatives: age, bmi i avg_glucose_level, tot i que com es pot veure als histogrames de l'apartat anterior, podem preveure que no ho seran.

L'edat segueix una distribució més tendint a uniforme.

Veiem que el bmi segueix una distribució lleugerament asimètrica, però bastant normal dins del que cap. Destaquen els outliers que fan que sembli bastant esbiaixada a la dreta.

Veiem que el nivell promig de glucosa fa que la distribució sigui bimodal. Es pot veure a l'histograma com hi ha dos pics diferents. Una suposició és que el pic inferior és de el nivell promig de la gent sana, i el pic superior del nivell promig de la gent diabètica.

A continuació mirarem l'homogeneïtat de la variància. Dividirem els datasets, en les persones que han tingut un infart o no, i utilitzarem el test de Fligner-Killeen per cada variable quantitativa.

Com podem veure, els p-valors són tots inferiors a 0.05, i per tant el test suggereix que les poblacions no tenen variàncies iguals pel que fa al factor stroke. Estem davant d'un dataset amb heterocedasticitat.

Aquí podem veure els diferents boxplots enfrontats, i podem veure la idea que les variàncies són bastant diferents en cada grup.

(4.3. - 5.) Aplicació de proves estadístiques per comparar els grups de dades. En funció de les dades i de l’objectiu de l’estudi, aplicar proves de contrast d’hipòtesis, correlacions, regressions, etc. Aplicar almenys tres mètodes d’anàlisi diferents. Representació dels resultats a partir de taules i gràfiques. (Resposta en conjunt perquè és més aclaridor)

Un punt a tractar és la conversió de les variables categòriques a variables numèriques per a que puguin ser interpretades pels classificadors. No caldrà fer-ho per les columnes 'hypertension' o 'heart_disease' perquè ja són de tipus numèric.

Ho farem amb la tècnica del One-Hot-Encoder. Abans, però, separarem els atributs de les etiquetes.

Ara generem els conjunts d'entrenament i verificació. També estandarditzarem les variables numèriques avg_glucose_level i bmi.

Un tema pendent de tractar és el desequilibri entre les dues categories de 'stroke'. Aquesta és una qüestió que no podem obviar ja que el desequilibri entre classes provoca biaixos en la majoria de classificadors a favor de la classe majoritària. Una opció evident seria eliminar instàncies majoritàries fins a igualar el nombre de minoritàries. Però també tenim la opció d'enriquir el dataset mab un major nombre de pacients minoritaris mitjançant SMOTE (Synthetic Minority Oversampling Technique).

La idea de SMOTE consisteix en crear (inventar) noves instàncies minoritàries mitjançant el mètode de KNN. Així, s'agafen els minoritaris, es calcula un KNN de x clusters, i es generen nous minoritaris entre cadascun dels minoritaris primitius i el centroide corresponent. Això és immediat per a variables numèriques; per a datasets amb variables numèriques i categòriques existeix la opció SMOTE-NC.

Amb aquesta opció, indiquem quínes són les variables categòriques i, per a aquestes, no es calcula una interpolació, es remostreja(copia) directament el valor.

El resultat és un conjunt amb 7518 instàncies euqilibrades per label 50-50.

Ara el que farem serà comparar els resultats que obtindríem amb un mateix classificador tant amb les dades inicials com amb el nou dataset ampliat. Utilitzarem com classificador patró la regressió logística.

Repetim el mateix amb el conjunt ampliat

I ara ens trobem en una situació de compromis: Els resultats són força semblants però en el primer cas, sense ampliar el conjunt de dades, s'obté un nombre de falsos negatius (predicció = 0, real = 1) FN=62 però gairebé no es comet cap altre error, mentre que en el cas ampliat, els FN=27, tot i que també han augmentat molt els falsos positius. En aquest cas potser sempre és millor reduir a la meitat els falsos negatius i donar tractament a la major quantitat de gent, a costa de malbaratar recursos amb els falsos positius que no enviar a casa a 35 pacients amb un AVC!

Seguirem per tant amb el joc de dades ampliat. Ara el que farem serà verificar els resultats que s'obtenen amb tres altres classificadors. Prendrem 3 dels més clàssics:

6. Resolució del problema. A partir dels resultats obtinguts, quines són les conclusions? Els resultats permeten respondre al problema?

En aquest treball preteniem obtenir determinar la bondat de diferents classificadors per a la identificació d'accidents vasculars cerebrals a partir d'un conjunt 5110 instàncies amb 12 atributs cadascuna entre numèrics i categòrics.

La primera etapa ha consistit en realitzar un EDA (Exploratory Data Analysis) que ens ha dut a realitzar les operacions:

Després hem dut a terme una codificació tipus One-Hot-Encoding de les variables categòriques i una estandarització de les variables numèriques per tal de poder-les utilitzar sense biaixos en els classificadors. Hem generat els corresponents conjunt de dades d'entrenament i validació.

Una qüestió important a destacar és que les dues classes (Accident o no) estan molt descompensades. Les instàncies corresponents a accident representen menys del 5% del total. Per tant, un classificador que sempre ens digués que no hi ha accident encertaria més del 95% de les vegades i busquem quelcom millor.

Per a corregir-ho, i perquè tenim un nombre força limitat d'instàncies hem utilitzat el mètode SMOTE. La idea bàsica consisteix en generar a partir dels minoritaris, un cert nombre de clusters (k = 5 per defecte) mitjançant KNN i generar noves instàncies minoritàries prenent per a cada columna entre cadascun dels punts minoritaris i el centroide al qual han estat assignats fins aconseguir un nombre suficient d'instàncies minoritàries. En el cas de variables categòriques en lloc d'interpolar es remostreja directament, Així, obtenim un conjunt equilibrat 50-50 de registres.

A partir d'aqui ja hem entrat en la generació dels classificadors. El primer que hem fet ha estat ajustar un mateix classificador, una regressió logística, amb els dos datasets: El dataset original i el dataset enriquit amb SMOTE. El resultat ha estat força esperable:

Un cop determinada la bondat del dataset SMOTE, hem entrenat tres classificadors més:

En tots els cassos hem obtingut pitjors valors de AUC que en el cas de la regressió lineal, essent l'arbre el que s'acostava més (0.78).

Contribucions Signa
Investigació prèvia jgualob, dhu
Redacció de les respostes jgualob, dhu
Desenvolupament codi jgualob, dhu